#include <stdio.h>
// std-标准(standard)
// i-input
// o-output
// 变量，写一个代码计算2个整数的和
int main()
{
    int a = 0; // 初始化
    int v = 0;
    // int sum=a+v; 放在scanf函数前面是错误的，输出为0，因为在用户输入之前就运算了，无论用户输入什么结果都是0。
    scanf("%d %d", &a, &v); // scanf是一个输入函数 &：取地址
    int sum = a + v;        // 放在scanf函数后面，这样才是获取用户输入后再运算
    printf("%d\n", sum);    // 输出函数，printf是一个库函数
    // printf("%d\n",a+v)； 这样写也可以
    return 0;
}
// 全局变量，静态变量都是放在静态区的  P32 P58  6.c
// 全局变量和静态变量不初始化的时候，默认会被初始化为0
// 局部变量，是放在栈区的，不初始化默认为随机值

// 1️⃣scanf
// ①占位符： P22~P23
// 处理数值占位符时，会自动过滤空白字符，包括空格、制表符、换行符等。
// 用户输入的数据之间，有一个或多个空格不影响scanf()解读数据。使用回车键，将输入分成几行，也不影响解读。
// 原理：用户的输入先放缓冲区，等按下回车键后，按照占位符对缓存进行解读，会从上一次解读遗留的第一个字符开始，直到读完缓存，或遇到第一个不符合条件的字符为止。
scanf("%d %f", &x, &y); // 输入:   -13.45e12# 0
printf("%d\n", x);      // 输出：-13
printf("%f\n", y);      // 输出：449999994880.000000 （浮点数在内存中有可能无法精确保存P33）
//%c %d %f %lf %Lf %s %[]  其中除了%c以外，都会自动忽略起首的空白字符。
//%c不忽略空白字符，总是返回当前第一个字符，无论该字符是否是空格。
char ch;
scanf("%c",&ch); //输入一个空格
printf("%c----",ch);//输出: ---- (空格----)
//如果要强制跳过字符前的空白字符，可以写成scanf(" %c",&ch); ，即在%c前加上一个空格，表示跳过零个或多个空白字符。 可见牛客网BC47
//%s在scanf函数中使用规则：从当前第一个非空白字符开始读起，直到遇到空白字符(即空格、换行符、制表符等)为止。
char ch[10];
scanf("%s",ch);//输入:  abc def (空格空格abc空格def)
printf("%s",ch);//输出:abc
//因为%s不会包含空白字符，所以无法用来读取多个单词，除非多个%s一起使用。
char ch[10];
char arr[10];
scanf("%s %s",ch,arr);//输入:  abc def (空格空格abc空格def)
printf("%s\n%s\n",ch,arr);
//输出：
//abc
//def
//scanf()遇到%s，会在字符串变量末尾存储一个'\0'。scanf()将字符串读入字符数组时，不会检测字符串是否超过了数组长度，所以可能造成溢出。
//为了防止这种情况，应指定读入字符串的最大长度，即写成 %ms，m表示读取字符串最大长度，后面的字符将被丢弃。（相当于printf函数的指定域宽）
char ch[5];
scanf("%4s",ch);//输入:abcdefg  （这里写%4s，是为了给'\0'留位置）
printf("%s",ch);//输出:abcd
//②赋值忽略符：
//有时用户的输入可能不符合预定的格式，比如scanf("%d-%d-%d",&y,&m,&d); ，若用户输入2025/4/8，scanf()解析数据就会失败。
//所以使用赋值忽略符：只要把*加在任何占位符的百分号后面，该占位符就不会返回值，解析后将被丢弃。
int y,m,d;
scanf("%d%*c%d%*c%d",&y,&m,&d);//无论输入2025-4-8或者2025/4/8还是2025 4 8等等都可以
printf("%d %d %d",y,m,d);//输出:2025 4 8
//③返回值：
// scanf读取成功的时候，返回的是读取的数据的个数 while(scanf("%d",n)==1)   多组输入
// scanf读取失败的时候返回EOF                  while(scanf("%d",n)!=EOF) 多组输入
// scanf没有读取任何项，或者匹配失败，则返回0

// 2️⃣printf ——print format(格式化)
// printf()不会在行尾自动添加换行符，运行结束后，光标就停留在输出结束的地方，不会自动换行
// 为了让光标移到下一行的开头，可以添加'\n'
// 输出格式：
// ①限定宽度：printf()允许限定占位符的最小宽度。
//%md表示这个占位符的宽度至少为m位。如果不满m位，对应的值的前面会添加空格；若超出m位，正常输出。
printf("%5d\n", 123);    // 输出:  123 （前面有两个空格）
printf("%5d\n", 123456); // 输出:123456
// printf函数默认右对齐，若想左对齐则添加-号 见11.c
printf("%-5d\n", 123);    // 输出:123   （后面有两个空格）
printf("%12f\n", 123.45); // 输出:  123.450000 （前面有两个空格）小数点也算，小数默认显示精度是小数点后6位
// ②显示正负号：默认情况下，对正数不显示+号，若想让正数也输出+号，可以在%后加+号
printf("%+d\n", 12);  // 输出：+12
printf("%+d\n", -12); // 输出：-12
// ③限定小数位数：保留小数点后m位，可写成 %.mf
printf("%.2f\n", 123.45678); // 输出：123.46（保留小数点后两位，四舍五入）
// 这种写法可以和限定宽度占位符结合使用
printf("%6.2f\n", 0.5); // 输出:  0.50 （前面有两个空格）最小宽度为6，小数位数为2
// 最小宽度和小数位数这两个限定值，都可以用*代替，通过printf()的参数传入。
printf("%*.*f\n", 6, 2, 0.5); // 输出:  0.50 （前面有两个空格，与上一个一样）
// ④输出部分字符串：若只想输出开头的部分，可以用 %.ms ，其中m表示要输出的长度
printf("%.7s\n", "hello world"); // 输出：hello w
// 返回值：P55
